#ifndef IPC_MAIN_H
#define IPC_MAIN_H

#include <stdbool.h>

#include "capi/cef_browser_capi.h"
#include "capi/cef_process_message_capi.h"
#include "capi/cef_values_capi.h"

#include "ipc/ipc_common.h"
#include "logger.h"
#include "tools/hash_map.h"
#include "tools/log_util.h"
#include "tools/post_task.h"

// 参数 args 会在调用后自动释放， 不需要手动释放。
/**
 * js 调用统一接口, 根据函数名称和掉哟个类型来分发函数， 此函数需要实现
 * event_name: 调用函数名
 * call_type: js调用{ 0， 不需要返回； 1: 需要返回 }， js 回调：{2， 不需要返回}
 * args: 返回参数
 */
typedef IPC_Value *(*on_main_process_message_handler)(char *event_name, int call_type, IPC_Value *args);

// 主进程消息处理器，分发进程消息
typedef struct {
    on_main_process_message_handler handler;
} main_process_message_handeler_t;

void _set_main_process_message_handeler(on_main_process_message_handler on_handler);

// typedef cef_list_value_t *(*IPC_Main_Handler)(cef_list_value_t *args);
typedef IPC_Value *(*IPC_Main_Handler)(IPC_Value *value);

// 注册主进程处理器, 监听渲染进程js调用
void _ipc_main_on(const char *event_name, IPC_Main_Handler handler);

// 发送消息给渲染进程
// request_id  是否返回， 0 不返回， 1 返回
void _ipc_main_send(cef_browser_t *browser, const char *event_name, IPC_Value *value, int request_id);

// 主进程处理来自JS的消息
int on_main_process_message_received(cef_browser_t *browser, struct _cef_frame_t *frame, cef_process_id_t source_pid,
                                     cef_process_message_t *message);

#endif